/**
 * @author Arian Stolwijk
 * @license MIT-License
 */


var pageMaster = new Class({
	
    Implements: Options,
	
	options : {
		width: null,
		height: null
	},
	
	/**
	 * Initialiseer de class
	 * @param {Array} 	pages Een array met alle pagina's
	 * @param {Element}	wrapper Het wrapper/container element, 
	 * 					waar alle pagina's inzitten
	 */
	initialize: function(pages,wrapper,options){
		// De afmetingen van het scherm.
		win_coords = $(window).getCoordinates();

		// Opties setten
		this.setOptions({
			width: win_coords.width,
			height: win_coords.height
		});
		this.setOptions(options);	
		var options = this.options;
		
		this.pages = pages;
		this.wrapper = wrapper;
		// de pagina elementen nog een niveau lager zetten door 
		// middel van een nieuw element te maken en die tussen 
		// de wrapper en de pages te zetten
		this.pageWrapper = new Element('div',{
			styles: {
				position: 'absolute',
				left: 0,
				top: 0
			}
		}).adopt(pages)
			.inject(wrapper)
			.set('morph',{
				duration: 1500
//				transition: Fx.Transitions.Back.easeOut
			});		
		
		// Al die elementen die afmetingen geven
		[wrapper,this.pageWrapper].extend(pages).each(function(elmt){
			elmt.setStyles({
				width: options.width,
				height: options.height					
			});
		});

		// Het aantal elementen tellen
		this.pages_count = pages.length;
		// De pagina verhouding bepalen. Bijvoorbeeld bij 4 paginas 
		// wordt de verhouding natuurlijk 2x2
		this.x_count = x_count = Math.floor(Math.sqrt(this.pages_count));
		
		// y variabele aanmaken
		var y = -1;
		pages.each(function(page,i){
			// De x positie. de i variabele is de iterator.
			var x = i % x_count;
			if(x == 0){
				y++;
			}
			
			// De x en y 
			page.setStyles({
				left: options.width * x,
				top: options.height * y
			});
		});
		
		if (pages.length >= 1) {
			// De huidige pagina 
			this.toPageNumber(0);
		}
	},
	
	/**
	 * Ga naar een bepaalde pagina
	 * @param {Element|string} page
	 */
	toPage: function(page){
		// Het element opzoeken
		if ($type(page) == 'string') {
			var goToElmt = this.wrapper.getElement('div[title='+page+']');
		}else if($type(page) == 'element' && this.pages.contains(page)){
			var goToElmt = page;
		}else{
			return false;
		}

		// Kijken of het gevonden element wel een element is...
		if ($type(goToElmt) == 'element') {
			// Morph/slide naar de juiste coordinaten. 
			// Zoals je kunt zien gebeurt dit door het parent element
			// van de pages naar links/rechts en boven/beneden te bewegen
			
			if (Browser.Engine.gecko) {
				// Very odd, firefox does not want to slide smoothly
				this.pageWrapper.setStyles({
					left: goToElmt.getStyle('left').toInt() * -1,
					top: goToElmt.getStyle('top').toInt() * -1
				}).morph({
					opacity: [0,1]
				});
			} else {
				this.pageWrapper.morph({
					left: goToElmt.getStyle('left').toInt() * -1,
					top: goToElmt.getStyle('top').toInt() * -1
				}); 
			}
			
			// De huidige pagina setten
			this.current = goToElmt;
			// Het element is actief gewoorden, het event activate afvuren
			goToElmt.fireEvent('activate');
			return goToElmt;
		}else{
			return false;
		}
	},
	
	/**
	 * Ga naar een bepaald pagina nummer (0-...)
	 * @param {int} i
	 */
	toPageNumber: function(i){
		if(this.pages[i]){
			return this.toPage(this.pages[i]);
		}
		return false;
	},
	
	/**
	 * Ga naar de volgende iteratie/pagina
	 */
	next: function(){
		return this.toPageNumber(this.pages.indexOf(this.current)+1);
	},
	
	/**
	 * Ga naar de vorige iteratie/pagina
	 */
	previous: function(){
		return this.toPageNumber(this.pages.indexOf(this.current)-1);
	},
	
	/**
	 * Een willekeurige pagina
	 */
	random: function(){
		// maar mag niet zichzelf zijn
		while((elmt = this.pages.getRandom()) == this.current){}			
		return this.toPage(elmt);
	},
	
	/**
	 * Naar de eerste pagina
	 */
	first: function(){
		return this.toPageNumber(0);
	},
	
	/**
	 * Naar de laatste pagina
	 */
	last: function(){
		return this.toPage(this.pages.getLast());
	}

});
